/*
 * @Author: your name
 * @Date: 2021-05-18 17:29:54
 * @LastEditTime: 2021-05-19 15:49:18
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \electromagnetic_launch\lib\diancitanshe.c
 */
#include "electronic.h"
/**
 * @brief 开始充能
 * @author CT Y
 * @date 2024-09-23
 */
void START_CHARGING(void)
{

	HAL_GPIO_WritePin(CHARGE_GPIO_Port, CHARGE_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(CHARGE_LED_GPIO_Port,CHARGE_LED_Pin,GPIO_PIN_RESET);
}
/**
 * @brief 停止充能
 * @author CT Y
 * @date 2024-09-23
 */
void STOP_CHARGING(void)
{

	HAL_GPIO_WritePin(CHARGE_GPIO_Port, CHARGE_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(CHARGE_LED_GPIO_Port,CHARGE_LED_Pin,GPIO_PIN_SET);
}
/**
 * @brief 开始泄能
 * @author CT Y
 * @date 2024-09-23
 */
void START_DISCHARGING(void)
{

	HAL_GPIO_WritePin(FANGDIAN_GPIO_Port, FANGDIAN_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(DISCHARGE_LED_GPIO_Port,DISCHARGE_LED_Pin,GPIO_PIN_RESET);
}
/**
 * @brief 停止泄能
 * @author CT Y
 * @date 2024-09-23
 */
void STOP_DISCHARGING(void)
{

	HAL_GPIO_WritePin(FANGDIAN_GPIO_Port, FANGDIAN_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(DISCHARGE_LED_GPIO_Port,DISCHARGE_LED_Pin,GPIO_PIN_SET);
}
/**
 * @brief 开始击发
 * @author CT Y
 * @date 2024-09-23
 */
void START_SHOOTING(void)
{

    HAL_GPIO_WritePin(SHOOT_GPIO_Port, SHOOT_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(SHOOT_LED_GPIO_Port,SHOOT_LED_Pin,GPIO_PIN_RESET);
}
/**
 * @brief 停止击发
 * @author CT Y
 * @date 2024-09-23
 */
void STOP_SHOOTING(void)
{

	HAL_GPIO_WritePin(SHOOT_GPIO_Port, SHOOT_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(SHOOT_LED_GPIO_Port,SHOOT_LED_Pin,GPIO_PIN_SET);
}
/**
 * @brief 根据MCU赋予的期望电压，将电压设置到期望电压
 * @author CT Y
 * @date 2024-09-23
 */
void set_actual_cap_value()
{   
    //这里的8可以根据电容电压维持的表现，酌情调整
    if(actual_cap_value<expert_cap_value-8 && actual_cap_value < MAX_CAP_VALUE) //当实际电压远小于期望值
    {   STOP_SHOOTING();
        START_CHARGING();
        STOP_DISCHARGING();
    }
    else if(actual_cap_value > expert_cap_value-8 && actual_cap_value < expert_cap_value+8) //当实际电压接近于期望值
    {   STOP_SHOOTING();
        STOP_CHARGING();
        STOP_DISCHARGING();
    }
    else if(actual_cap_value  > expert_cap_value+8  && actual_cap_value > MIN_CAP_VALUE) //当实际电压大于期望值
    {   STOP_SHOOTING();
        STOP_CHARGING();
        START_DISCHARGING();
    }
}
/**
 * @brief 接受外部串口信号，根据串口信号进行控制
 * @author CT Y
 * @date 2024-09-23
 */
void mcu_control()
{
    set_actual_cap_value();
    HAL_Delay(5);
    if(received_data[1]==0x01)//接收到击发信号，开始击球
    {
        STOP_CHARGING();
        STOP_DISCHARGING();
        HAL_Delay(10);
        START_SHOOTING();
        HAL_Delay(100);
        STOP_SHOOTING();
        HAL_Delay(2500);
    }
    else
    {
        STOP_SHOOTING();
    }
    HAL_Delay(20);
}
/**
 * @brief 使用外部按键进行控制
 * @author CT Y
 * @date 2024-09-23
 */
void exti_control()
{
    if(CHARGE_VALUE==GPIO_PIN_RESET)
    {
        START_CHARGING();
    }
    else
    {
        STOP_CHARGING();
    }

    if(DISCHARGE_VALUE==GPIO_PIN_RESET)
    {
        START_DISCHARGING();
    }
    else
    {
        STOP_DISCHARGING();
    }

    if(SHOOT_VALUE==GPIO_PIN_RESET)
    {
        START_SHOOTING();
    }
    else
    {
        STOP_SHOOTING();
    }
}

/**
 * @brief 控制权分配和控制，并显示OLED信息
 * @author CT Y
 * @date 2024-09-23
 */
void electronic_dispatch()
{
    if(control_source==CONTROLED_BY_MCU)
    {
        oled_show_string(82,2,"MCU",FONT_16_EN);
        HAL_GPIO_WritePin(FULL_LED_GPIO_Port,FULL_LED_Pin,GPIO_PIN_RESET);
        mcu_control();
    }

    else if(control_source==CONTROLED_BY_EXTI)
    {
        oled_show_string(82,2,"KEY",FONT_16_EN);
        HAL_GPIO_WritePin(FULL_LED_GPIO_Port,FULL_LED_Pin,GPIO_PIN_SET);
        exti_control();
    }
}
